package com.wy.jarscan;//package com.qm.erp.ds;
//
//import com.alibaba.fastjson.JSONObject;
//import com.google.gson.JsonObject;
//import com.qm.erp.fw.adapter.rpc.RemoteClient;
//import io.swagger.annotations.ApiOperation;
//
//import java.io.File;
//import java.lang.reflect.Method;
//import java.lang.reflect.Parameter;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author wangyong
// * @version 1.0
// * @description
// * @date 2023-06-21 09:35
// */
//public class InterfaceFinder {
//    public static List<Class<?>> getClasses(String packageName) {
//        List<Class<?>> classes = new ArrayList<>();
//        String path = packageName.replace(".", "/");
//        File dir = new File(Thread.currentThread().getContextClassLoader().getResource(path).getFile());
//        if (dir.exists()) {
//            for (File file : dir.listFiles()) {
//                String fileName = file.getName();
//                if (file.isDirectory()) {
//                    List<Class<?>> subClasses = getClasses(packageName + "." + fileName);
//                    classes.addAll(subClasses);
//                } else if (fileName.endsWith(".class")) {
//                    String className = fileName.substring(0, fileName.length() - 6);
//                    try {
//                        classes.add(Class.forName(packageName + "." + className));
//                    } catch (ClassNotFoundException e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//        }
//        return classes;
//    }
//
//    public static void findIllegalInterfaces(String packageName) {
//        List<Class<?>> classes = getClasses(packageName);
//        for (Class<?> clazz : classes) {
//            if (clazz.isInterface()) {
//                if (clazz.getAnnotation(RemoteClient.class) == null) {
//                    System.out.println("接口：[" + clazz.getName() + "] 没有添加RemoteClient注解");
//                }
//
//                Method[] declaredMethods = clazz.getDeclaredMethods();
//                for (Method method : declaredMethods) {
//                    ApiOperation annotation = method.getAnnotation(ApiOperation.class);
//                    if (annotation == null) {
//                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 没有添加ApiOperation注解");
//                    }
//
//                    // 判断返回值类型
//                    Type returnType = method.getGenericReturnType();
//                    if (returnType.equals(Object.class)) {
//                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值为Object");
//                    }
//
//                    if (returnType.equals(JSONObject.class)) {
//                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值为JSONObject");
//                    }
//
//                    if (returnType instanceof ParameterizedType) {
//                        ParameterizedType type = (ParameterizedType) returnType;
//                        Type[] typeArguments = type.getActualTypeArguments();
//                        for (Type typeArgument : typeArguments) {
//                            if (typeArgument == Object.class) {
//                                System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有Object类型");
//                                break;
//                            }else if(typeArgument == JSONObject.class){
//                                System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有JSONObject类型");
//                                break;
//                            }else if(typeArgument instanceof ParameterizedType){
//                                ParameterizedType innerType = (ParameterizedType) typeArgument;
//                                Type[] innerTypeArguments = innerType.getActualTypeArguments();
//                                for (Type innerTypeArgument : innerTypeArguments) {
//                                    if (innerTypeArgument == Object.class) {
//                                        System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 返回值含有Object类型");
//                                        break;
//                                    }
//                                }
//                            }
//                        }
//                    }
//
//                    // 判断参数类型
//                    Parameter[] parameters = method.getParameters();
//                    for (Parameter parameter : parameters) {
//                        Type parameterizedType = parameter.getParameterizedType();
//                        if (parameterizedType.equals(Object.class)) {
//                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "]为Object");
//                        }
//
//                        if(parameterizedType == JSONObject.class){
//                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "]为JSONObject");
//                            break;
//                        }
//
//                        if (parameterizedType instanceof ParameterizedType) {
//                            ParameterizedType type = (ParameterizedType) parameterizedType;
//                            Type[] typeArguments = type.getActualTypeArguments();
//                            for (Type typeArgument : typeArguments) {
//                                if (typeArgument == Object.class) {
//                                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有Object类型");
//                                    break;
//                                }else if(typeArgument == JSONObject.class){
//                                    System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有JSONObject类型");
//                                    break;
//                                }else if(typeArgument instanceof ParameterizedType){
//                                    ParameterizedType innerType = (ParameterizedType) typeArgument;
//                                    Type[] innerTypeArguments = innerType.getActualTypeArguments();
//                                    for (Type innerTypeArgument : innerTypeArguments) {
//                                        if (innerTypeArgument == Object.class) {
//                                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有Object类型");
//                                            break;
//                                        }
//
//                                        if (innerTypeArgument == JSONObject.class) {
//                                            System.out.println("接口：[" + clazz.getName() + "] 方法：[" + method.getName() + "] 参数:[" + parameter.getName() + "] 含有JSONObject类型");
//                                            break;
//                                        }
//                                    }
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//    }
//
//    public static void main(String[] args) {
//        findIllegalInterfaces("com.qm.erp.ds.api");
//        findIllegalInterfaces("com.qm.erp.ds.query.api");
//    }
//}
